home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_03 / mccauley / fuzzy.h < prev   
C/C++ Source or Header  |  1994-02-07  |  3KB  |  131 lines

  1.  
  2. 'C'  Declaration Code for Rule Table and Membership Functions
  3.  
  4. /**********************************************************************
  5.     File: fuzzy.h
  6.     Date: 4/3/93
  7.     Author: Jack J. McCauley
  8.     Header file for fuzzy.c
  9. **********************************************************************/
  10.  
  11. /* membership function size */
  12. #define TORQUE_MEMBERS  5
  13. #define DER_MEMBERS  5
  14.  
  15. /* loop frequency */
  16. #define LOOP_HZ 1
  17.  
  18. /* integrator constant z-1*/
  19. #define SKIP 1
  20.  
  21. /* normalized value */
  22. #define NORMAL 255
  23.  
  24. /* Current ma */
  25. #define MAX_TORQUE 1000
  26. #define MIN_TORQUE -1000
  27.  
  28. /* derivative */
  29. #define MAX_DERI LOOP_HZ*MAX_TORQUE
  30. #define MIN_DERI LOOP_HZ*MIN_TORQUE
  31.  
  32. /* pwm 1/10 % */
  33. #define MAX_PWM   255
  34. #define MIN_PWM   0
  35.  
  36. /* Max and Min */
  37. #define MIN_ERROR   0
  38. #define MAX_ERROR   255
  39.  
  40. /* size of all arrays */
  41. #define ARRAY_SIZE   256
  42.  
  43. /* represent a normalized 0 -> 1000 = 0.0 -> 1.0 */
  44. #define FUZZY_RADIX  NORMAL
  45.  
  46. /* fuzzy max (ternary) operator */
  47. #define FUZ_MAX( x, y )    ((x>y) ? x : y)
  48.  
  49. /* fuzzy min (ternary) operator */
  50. #define FUZ_MIN( x, y )    ((x<y) ? x : y)
  51.  
  52. /* fuzzy AND operator */
  53. #define FUZ_AND( x, y )    FUZ_MIN( x, y )
  54.  
  55. /* fuzzy OR operator */
  56. #define FUZ_OR( x, y )     FUZ_MAX( x, y )
  57.  
  58. /* fuzzy compliment operator */
  59. #define FUZ_NOT( x )       ( FUZZY_RADIX - x )
  60.  
  61. /* create the membership function space */
  62. /* first is the torque error  fuzzy set */
  63. struct  s_torq_members {
  64.     int neg_large[ARRAY_SIZE];
  65.     int neg_med[ARRAY_SIZE];
  66.     int zero[ARRAY_SIZE];
  67.     int pos_med[ARRAY_SIZE];
  68.     int pos_large[ARRAY_SIZE];
  69.     float slope;
  70.     float intercept;
  71. }  torq_members;
  72.  
  73. /* next is the rate of change fuzzy set torque error */
  74. struct  s_deri_members {
  75.     int pos_large[ARRAY_SIZE];
  76.     int pos_med[ARRAY_SIZE];
  77.     int zero[ARRAY_SIZE];
  78.     int neg_med[ARRAY_SIZE];
  79.     int neg_large[ARRAY_SIZE];
  80.     float slope;
  81.     float intercept;
  82. } deri_members;
  83.  
  84. /* last is the PWM fuzzy set ouput */
  85. struct  s_pwm_members {
  86.     int neg_large[ARRAY_SIZE];
  87.     int neg_med[ARRAY_SIZE];
  88.     int zero[ARRAY_SIZE];
  89.     int pos_med[ARRAY_SIZE];
  90.     int pos_large[ARRAY_SIZE];
  91.     float slope;
  92.     float intercept;
  93. } pwm_members;
  94.  
  95. /* define output rule table members */
  96. #define L            pwm_members.pos_large
  97. #define M            pwm_members.pos_med
  98. #define Z            pwm_members.zero
  99. #define NM           pwm_members.neg_med
  100. #define NL           pwm_members.neg_large
  101.  
  102. /* finally the fuzzy sets */
  103. /* torque feedback error */
  104. int *dTerr_dt[] = {
  105.          deri_members.pos_large  ,
  106.          deri_members.pos_med    ,
  107.          deri_members.zero       ,
  108.          deri_members.neg_med    ,
  109.          deri_members.neg_large
  110.          };
  111. /* torque (OZ-in) */
  112. int *Terror[] = {
  113.          torq_members.neg_large  ,
  114.          torq_members.neg_med    ,
  115.          torq_members.zero       ,
  116.          torq_members.pos_med    ,
  117.          torq_members.pos_large
  118.          };
  119.  
  120. /* create the rule table and allocate space */
  121. struct  s_rule {
  122.     int *table[TORQUE_MEMBERS];
  123. } rule[DER_MEMBERS] =
  124.     /* */
  125.     {{Z,   NM, NM, NM,  NL },
  126.     { M,   Z,  NM, NM,  NL },
  127.     { L,   M,  Z,  NM,  NL },
  128.     { L,   M,  M,  Z,   NM  },
  129.     { L,   M,  M,  M,   Z  }};
  130.  
  131.